采样演练
交互式练习:对照下面这个示例项目,逐步查看 sampling 在服务器端和客户端各自是如何实现的。点击"下一步"会自动打开对应文件并高亮相关代码;文件树里的任何文件都可以随时点开查看。
教程步骤
让我们通过一个示例项目来更好地了解如何实现此功能。
在服务器端,在工具调用期间,运行 create_message() 方法,传入一些您希望发送给语言模型的消息。
在客户端,您必须实现一个采样回调。它将接收服务器提供的消息列表。
服务器提供的消息列表是为 MCP 中的通信而格式化的。这些单独的消息不保证与您使用的任何 LLM SDK 兼容。
例如,如果您使用的是 Anthropic SDK,您需要编写一些转换逻辑,将 MCP 消息转换为与 Anthropic SDK 兼容的格式。
使用 LLM 生成文本后,您将返回一个 CreateMessageResult,其中包含生成的文本。
别忘了:客户端上的回调需要传入 ClientSession 调用中。
客户端生成并返回一些文本后,它将被发送到服务器。您可以对这段文本做任何事情:
- 将其用作工具中工作流程的一部分
- 决定进行另一次采样调用
- 返回生成的文本
from mcp.server.fastmcp import FastMCP, Contextfrom mcp.types import SamplingMessage, TextContentmcp = FastMCP(name="Demo Server")@mcp.tool()async def summarize(text_to_summarize: str, ctx: Context):prompt = f"""Please summarize the following text:{text_to_summarize}"""result = await ctx.session.create_message(messages=[SamplingMessage(role="user", content=TextContent(type="text", text=prompt))],max_tokens=4000,system_prompt="You are a helpful research assistant.",)if result.content.type == "text":return result.content.textelse:raise ValueError("Sampling failed")if __name__ == "__main__":mcp.run(transport="stdio")